# 使用ItemLoader填充容器
"""
当项目很大，提取的字段 数以百计的时候，手动设置 item 变成一个困难的问题，因此我们将会使用 ItemLoader 通过一定规则 自动对Item进行赋值
"""
from scrapy import Request
from scrapy.spiders import Spider
from qidian_hot.items import QidianHotItem
from scrapy.loader import ItemLoader  # 导入 ItemLoader类


# 使用ItemLoader之前，必须先对其实例化
# 起点中文网热销帮 爬取

class HotSalesSpider(Spider):
    # 定义爬虫名称
    name = "hot05"
    # 起始url列表   起点中文热销帮的地址
    start_urls = "https://www.qidian.com/rank/hotsales/page1"
    # 定义当前的起始页面
    cur_page = 1

    # 解析函数
    def start_requests(self):
        # 生成请求对象 设置url headers callback
        yield Request(self.start_urls)

    def parse(self, response, **kwargs):
        # 使用xpath 定位到 小说内容的div元素，保存到列表中
        list_selector = response.xpath("//div[@class='book-mid-info']")
        # 依次读取每部小说的元素，从中获取名称、作者、类型和形式
        for one_selector in list_selector:
            # 生成ItemLoader 的实列、
            # 参数item接收到Item实例 ，selector接收一个选择器
            novel = ItemLoader(item=QidianHotItem(), selector=one_selector)
            novel.add_xpath("name", "h2/a/text()")
            novel.add_xpath("author", "p[1]/a[1]/text()")
            novel.add_xpath("type", "p[1]/a[2]/text()")
            novel.add_xpath("form", "p[1]/span/text()")

            # 使用item
            yield novel.load_item()
        self.cur_page = self.cur_page + 1
        if self.cur_page <= 5:
            next_url = "https://www.qidian.com/rank/hotsales/page{}".format(self.cur_page)
            yield Request(next_url)

# TODO 使用 scrapy crawl hot -o hot.csv  命令保存数据卫 hot.csv
